﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Data.SqlClient;
using System.Configuration;
using System.Globalization;
using TheBullysStore.Models.ModuloServicios.MantenimientoCorrectivo;
using log4net;

namespace TheBullysStore.Models.ModuloServicios.CuotaExtraordinaria
{
    public class CuotaExtraordinariaDAO
    {
        private static ILog log = LogManager.GetLogger(typeof(CuotaExtraordinariaDAO));
        public string RegistrarCuotaExtraordinaria(CuotaExtraordinariaBean cuota)
        {
            SqlConnection sqlCon = null;
            CuotaExtraordinariaBean CuotaExtra = null;
            List<CuotaExtraordinariaBean> listaCuotas = new List<CuotaExtraordinariaBean>();
        try
        {

            String cadenaConfiguracion = ConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;
            sqlCon = new SqlConnection(cadenaConfiguracion);
            if (cuota.Tipo == 2)
            {
                sqlCon.Open();
                string commandString = "DECLARE @MyTableVar table(IdCuotaExtraordinaria int); INSERT INTO Cuota_Extraordinaria (Monto,Motivo,fecha_inicio,Estado,id_Edificio,periodo,tipo) " +
                    "output INSERTED.IdCuotaExtraordinaria into @MyTableVar VALUES (" + cuota.MontoTotal + ",'" + cuota.Descripcion + "'," + "convert(datetime,'" + cuota.Fecha + "',103), " +
                    cuota.Estado + ", " + cuota.IdEdificio + ", " + cuota.Periodo + ", " + cuota.Tipo + "); select IdCuotaExtraordinaria from @MyTableVar";
                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);
                //sqlCmd.ExecuteNonQuery();
                //sqlCmd = new SqlCommand(commandString, sqlCon);
                SqlDataReader dataReader = sqlCmd.ExecuteReader();
                if (dataReader.Read())
                {
                    CuotaExtra = new CuotaExtraordinariaBean();
                    CuotaExtra.Id = (int)(dataReader[0]);
                }
                

            }
            else if (cuota.Tipo == 1)
            {
                sqlCon.Open();
                string commandString = "INSERT INTO Cuota_Extraordinaria (Monto,Motivo,fecha_inicio,Estado,id_Edificio,periodo,tipo,id_mantenimiento_correctivo) " +
                    "VALUES (" + cuota.MontoTotal + ",'" + cuota.Descripcion + "'," + "convert(datetime,'" + cuota.Fecha + "',103), " +
                    cuota.Estado + ", " + cuota.IdEdificio + ", " + cuota.Periodo + ", " + cuota.Tipo + ", "+cuota.IdCorrectivo+"); "+
                    "update mantenimiento_correctivo set estado=2 where id_mantenimiento_correctivo="+cuota.IdCorrectivo+"; select d.id_departamento, ce.IdCuotaExtraordinaria from departamento d, habitante h, incidencia_x_habitante ixh, incidencia i, " +
                    "mantenimiento_correctivo mc, Cuota_Extraordinaria ce where d.id_departamento=h.id_departamento and ixh.id_habitante = h.id_persona and " +
                    "i.Id_Incidencia=ixh.id_incidencia and mc.id_incidencia = i.Id_Incidencia and mc.id_mantenimiento_correctivo=ce.id_mantenimiento_correctivo "+
                    "and mc.id_mantenimiento_correctivo=" + cuota.IdCorrectivo+" and mc.estado="+2;
                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);
                SqlDataReader dataReader = sqlCmd.ExecuteReader();
                while (dataReader.Read())
                {
                    CuotaExtra = new CuotaExtraordinariaBean();
                    CuotaExtra.IdDepartamento = (int)(dataReader[0]);
                    CuotaExtra.Id = (int)(dataReader[1]);
                    listaCuotas.Add(CuotaExtra);
                }
            }
        }
        catch (Exception ex)
        {
            cuota.Conexion = "Conexión Fallida";
            log.Error("Registrar CuotaExtra(EXCEPTION): ", ex);
            
        }
        finally
        {
            sqlCon.Close();
            if (cuota.Conexion != "Conexión Fallida"){
                if (cuota.Tipo == 2) {
                    cuota.Conexion= llenarTablaHija(cuota,CuotaExtra);
                }
                else if (cuota.Tipo == 1)
                {
                    cuota.Conexion = llenarTablaHija2(cuota, listaCuotas);
                }
            }
        }
        return cuota.Conexion;
        }

        public string llenarTablaHija(CuotaExtraordinariaBean cuota, CuotaExtraordinariaBean CuotaExtra)
        {
            SqlConnection sqlCon = null;
            SqlCommand sqlCmd = null;
            double MontoAgregar = 0;
            try
            {
                String cadenaConfiguracion = ConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;
                sqlCon = new SqlConnection(cadenaConfiguracion);
                var monto = cuota.MontoTotal / cuota.Periodo;
                monto /= cuota.ArregloDepas.Length;
                var mes = cuota.Mes-1;
                var anio = cuota.Anio;
                sqlCon.Open();
                for (int j = 0; j < cuota.Periodo; j++)
                {
                    mes++;
                    if (mes == 13)
                    {
                        mes = 1;
                        anio++;
                    }
                    foreach (int i in cuota.ArregloDepas)
                    {
                        string commandString = "INSERT INTO cuota_extraordinaria_x_departamento (IdCuotaExtraordinaria,id_departamento, monto, estado,mes,anio) VALUES (" +
                        CuotaExtra.Id + ", " + i + ", " + monto + ", 1, " + mes + ", " + anio + ")";
                        sqlCmd = new SqlCommand(commandString, sqlCon);
                        sqlCmd.ExecuteNonQuery();
                        commandString = "select Id_Cuenta, monto_mensual from cuenta_por_cobrar where mes=" + cuota.Mes + " and anio =" + cuota.Anio + " and id_departamento="+i;
                        sqlCmd = new SqlCommand(commandString, sqlCon);
                        SqlDataReader dataReader = sqlCmd.ExecuteReader();
                        if (dataReader.Read())
                        {
                            cuota.IdCuenta = (int)(dataReader[0]);
                            if (!Convert.IsDBNull(dataReader[1]))
                            {
                                cuota.MontoCuenta = Convert.ToDouble(dataReader[1]);
                            } else cuota.MontoCuenta=0;
                        }
                        sqlCon.Close();
                        sqlCon.Open();
                        MontoAgregar = monto + cuota.MontoCuenta;
                        commandString = "update cuenta_por_cobrar set monto_mensual=" + MontoAgregar + " where id_cuenta=" + cuota.IdCuenta + ";" +
                            "update cuota_extraordinaria_x_departamento set Id_Cuenta=" + cuota.IdCuenta + " where IdCuotaExtraordinaria =" + CuotaExtra.Id;
                        sqlCmd = new SqlCommand(commandString, sqlCon);
                        sqlCmd.ExecuteNonQuery();
                    }
                }
                        
                cuota.Conexion = "Bien";
            }
            catch (Exception ex)
            {
                cuota.Conexion = "Conexión Fallida";
                log.Error("Registrar CuotaExtraxDepa1(EXCEPTION): ", ex);
                
            }
            finally
            {
                sqlCon.Close();            
            }
            return cuota.Conexion;
        }

        public string llenarTablaHija2(CuotaExtraordinariaBean cuota, List<CuotaExtraordinariaBean> listaCuotas)
        {
            SqlConnection sqlCon = null;
            SqlCommand sqlCmd = null;
            try
            {
                String cadenaConfiguracion = ConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;
                sqlCon = new SqlConnection(cadenaConfiguracion);
                var monto = cuota.MontoTotal / cuota.Periodo;
                monto /= listaCuotas.Count;
                var mes = cuota.Mes-1;
                var anio = cuota.Anio;
                double MontoAgregar = 0;
                sqlCon.Open();
                for (int j = 0; j < cuota.Periodo; j++)
                {
                    mes++;
                    if (mes == 13)
                    {
                        mes = 1;
                        anio++;
                    }
                    foreach (CuotaExtraordinariaBean CuotaExtra in listaCuotas)
                    {
                        cuota.Id=CuotaExtra.Id;
                        string commandString = "INSERT INTO cuota_extraordinaria_x_departamento (IdCuotaExtraordinaria,id_departamento, monto, estado,mes,anio) VALUES (" +
                        CuotaExtra.Id + ", " + CuotaExtra.IdDepartamento + ", " + monto + ", 1, " + mes + ", " + anio + ")";
                        sqlCmd = new SqlCommand(commandString, sqlCon);
                        sqlCmd.ExecuteNonQuery();
                        sqlCon.Close();
                        sqlCon.Open();
                        commandString = "select Id_Cuenta, monto_mensual from cuenta_por_cobrar where mes=" + cuota.Mes + " and anio =" + cuota.Anio + " and id_departamento=" + CuotaExtra.IdDepartamento;
                        sqlCmd = new SqlCommand(commandString, sqlCon);
                        SqlDataReader dataReader = sqlCmd.ExecuteReader();
                        if (dataReader.Read())
                        {
                            cuota.IdCuenta = (int)(dataReader[0]);
                            if (!Convert.IsDBNull(dataReader[1]))
                            {
                                cuota.MontoCuenta = Convert.ToDouble(dataReader[1]);
                            }
                            else cuota.MontoCuenta = 0;
                        }
                        sqlCon.Close();
                        sqlCon.Open();
                        MontoAgregar = monto + cuota.MontoCuenta;
                        commandString = "update cuenta_por_cobrar set monto_mensual=" + MontoAgregar + " where id_cuenta=" + cuota.IdCuenta + ";" +
                            "update cuota_extraordinaria_x_departamento set Id_Cuenta=" + cuota.IdCuenta + " where IdCuotaExtraordinaria ="+ cuota.Id;
                        sqlCmd = new SqlCommand(commandString, sqlCon);
                        sqlCmd.ExecuteNonQuery();
                    }
                    
                } 
                cuota.Conexion = "Bien";
            }
            catch (Exception ex)
            {
                cuota.Conexion = "Conexión Fallida";
                log.Error("Registrar CuotaExtraxDepa2(EXCEPTION): ", ex);

            }
            finally
            {
                sqlCon.Close();
            }
            return cuota.Conexion;
        }

         public string ModificarCuotaExtraordinaria(CuotaExtraordinariaBean cuota)
         {
             SqlConnection sqlCon = null;
             try
             {
                 String cadenaConfiguracion = ConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;

                 sqlCon = new SqlConnection(cadenaConfiguracion);

                 sqlCon.Open();

                 string commandString = "UPDATE Cuota_Extraordinaria SET periodo = " +
                     cuota.Periodo + ", Motivo = '" + cuota.Descripcion + "' WHERE IdCuotaExtraordinaria = " + cuota.Id;
                 SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);
                 sqlCmd.ExecuteNonQuery();
                 cuota.Conexion = "Bien";

             }

             catch (Exception ex)
             {
                 cuota.Conexion = "Conexion Fallida";
                 log.Error("Modificar ModificarCuotaExtraordinaria(EXCEPTION): ", ex);
             }
             finally
             {
                 sqlCon.Close();
             }

             return cuota.Conexion;
         }

         public string EliminarCuotaExtraordinaria(CuotaExtraordinariaBean cuota)
         {
             SqlConnection sqlCon = null;
             try
             {
                 String cadenaConfiguracion = ConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;
                 var count = 0;
                 sqlCon = new SqlConnection(cadenaConfiguracion);

                 sqlCon.Open();

                 string commandString = "UPDATE Cuota_Extraordinaria_x_departamento SET Estado = 0 WHERE Estado=1 and IdCuotaExtraordinaria = "
                     + cuota.Id;
                 SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);
                 sqlCmd.ExecuteNonQuery();
                 sqlCon.Close();
                 commandString = "SELECT Count(*) from Cuota_Extraordinaria_x_departamento where Estado=0 and IdCuotaExtraordinaria = "
                     + cuota.Id;
                 sqlCon.Open();
                 SqlDataReader dataReader = sqlCmd.ExecuteReader();
                 if (dataReader.Read())
                 {
                     count = (int)(dataReader[0]);
                 }
                 if (count > 0)
                 {
                     commandString = "UPDATE Cuota_Extraordinaria set Estado = 0 where IdCuotaExtraordinaria = " + cuota.Id;
                 }
                 else
                 {
                     commandString = "";
                     cuota.Conexion = "No se puede eliminar";
                 }
                 sqlCon.Close();
                 sqlCon.Open();
                 sqlCmd = new SqlCommand(commandString, sqlCon);
                 sqlCmd.ExecuteNonQuery();


                 cuota.Conexion = "Bien";
             }
             catch (Exception ex)
             {
                 cuota.Conexion = "Conexion Fallida";
                 log.Error("Eliminar ModificarCuotaExtraordinaria(EXCEPTION): ", ex);
             }
             
             finally
             {
                 sqlCon.Close();
             }
             return cuota.Conexion;
         }



         public List<CuotaExtraordinariaBean> ListarCuotas(CuotaExtraordinariaBean cuota)
        {
            SqlConnection sqlCon = null;
            List<CuotaExtraordinariaBean> listaCuotas = null;
            try
            {
                listaCuotas = new List<CuotaExtraordinariaBean>();

                String cadenaConfiguracion = ConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;

                sqlCon = new SqlConnection(cadenaConfiguracion);
                string commandString = "";
                sqlCon.Open();
                if (cuota.Tipo == 1)
                {
                    commandString = "SELECT cp.*, e.Nombre, m.Nombre FROM Cuota_Extraordinaria cp, Edificio e, mantenible m, mantenimiento_correctivo mc " +
                    "where cp.id_Edificio=e.id_Edificio and cp.id_mantenimiento_correctivo = mc.id_mantenimiento_correctivo and mc.id_mantenible = m.id_mantenible";
                    if (cuota.Estado != 2) commandString += "  and cp.Estado = " + cuota.Estado;
                    if (cuota.IdEdificio != 0) commandString += " and cp.id_Edificio =" + cuota.IdEdificio;
                    if (cuota.FechaI != null) commandString += " and convert(datetime,'" + cuota.FechaI + "',103) <= cp.fecha_inicio";
                    if (cuota.FechaF != null) commandString += " and convert(datetime,'" + cuota.FechaF + "',103) >= cp.fecha_inicio";
                }
                else if (cuota.Tipo == 2)
                {
                    commandString = "SELECT ce.*, e.Nombre FROM Cuota_Extraordinaria ce, Edificio e where ce.id_Edificio=e.id_Edificio and ce.id_mantenimiento_correctivo is null";

                    if (cuota.Estado != 2)
                    {
                        commandString += "  and ce.Estado = " + cuota.Estado;
                    }
                    if (cuota.IdEdificio != 0)
                    {
                        commandString += " and ce.id_Edificio =" + cuota.IdEdificio;
                    }
                    if (cuota.FechaI != null)
                    {
                        commandString += " and convert(datetime,'" + cuota.FechaI + "',103) <= ce.fecha_inicio";
                    }
                    if (cuota.FechaF != null)
                    {
                        commandString += " and convert(datetime,'" + cuota.FechaF + "',103) >= ce.fecha_inicio";
                    }
                }
                SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);
                SqlDataReader dataReader = sqlCmd.ExecuteReader();

                while (dataReader.Read())
                {
                    CuotaExtraordinariaBean CuotaExtra = new CuotaExtraordinariaBean();
                    CuotaExtra.Id = (int)dataReader[0];
                    CuotaExtra.MontoTotal = Convert.ToDouble(dataReader[1]);
                    CuotaExtra.Descripcion = (string)dataReader[2];
                    CuotaExtra.Fecha = ((DateTime)dataReader[3]).ToString("dd/MM/yyyy");
                    CuotaExtra.Estado = (int)dataReader[4];
                    CuotaExtra.IdEdificio = (int)dataReader[5];
                    CuotaExtra.Periodo = (int)dataReader[6];
                    if (!Convert.IsDBNull(dataReader[7]))
                    {
                        CuotaExtra.IdCorrectivo = (int)dataReader[7];
                    }
                    else
                    {
                        CuotaExtra.IdCorrectivo = 0;
                    }

                    CuotaExtra.Tipo = (int)dataReader[8];
                    CuotaExtra.NombreEdificio = (string)dataReader[9];
                    if (CuotaExtra.Tipo == 2) CuotaExtra.NombreMantenible = "";
                    else CuotaExtra.NombreMantenible = (string)dataReader[10];
                    listaCuotas.Add(CuotaExtra);
                }

                dataReader.Close();
                
                
            }
            catch (Exception ex)
            {
                cuota.Conexion = "Conexion Fallida";
                log.Error("Registrar ModificarCuotaExtraordinaria(EXCEPTION): ", ex);
            }
            finally
            {
                sqlCon.Close();
            }
            return listaCuotas;
        }

         public List<MantenimientoCorrectivoBean> ListarMantenimientoCorrectivo(MantenimientoCorrectivoBean mantenimientocorrectivo)
         {
             List<MantenimientoCorrectivoBean> listamantenimientocorrectivo = null;
             SqlConnection sqlCon = null;
             try
             {
                 listamantenimientocorrectivo = new List<MantenimientoCorrectivoBean>();

                 String cadenaConfiguracion = ConfigurationManager.ConnectionStrings["TheBullysStore"].ConnectionString;

                 sqlCon = new SqlConnection(cadenaConfiguracion);

                 sqlCon.Open();
                 string commandString = "select mc.*, m.Nombre from mantenimiento_correctivo mc, mantenible m where " +
                     "mc.id_mantenible=m.id_mantenible and mc.id_edificio=" + mantenimientocorrectivo.IdEdificio + " and mc.estado = 1";
                 SqlCommand sqlCmd = new SqlCommand(commandString, sqlCon);

                 SqlDataReader dataReader = sqlCmd.ExecuteReader();

                 while (dataReader.Read())
                 {
                     MantenimientoCorrectivoBean MantCorrectivo = new MantenimientoCorrectivoBean();
                     MantCorrectivo.FechaMantenimientoCorrectivo = ((DateTime)dataReader[0]).ToString("dd/MM/yyyy");
                     MantCorrectivo.IdMantenible = (int)dataReader[1];
                     MantCorrectivo.IdMantenimientoCorrectivo = (int)dataReader[2];
                     MantCorrectivo.ObservacionMantenimientoCorrectivo = (string)dataReader[3];
                     MantCorrectivo.EstadoMantenimientoCorrectivo = (int)dataReader[4];
                     MantCorrectivo.MontoMantenimientoCorrectivo = Convert.ToDouble(dataReader[5]);
                     MantCorrectivo.NombreMantenimientoCorrectivo = (string)dataReader[6];
                     MantCorrectivo.LugarMantenimientoCorrectivo = (string)dataReader[8];
                     MantCorrectivo.NombreMantenible = (string)dataReader[12];
                     listamantenimientocorrectivo.Add(MantCorrectivo);
                 }

                 dataReader.Close();

                 
             }
             catch (Exception ex)
             {
                 mantenimientocorrectivo.Conexion = "Conexion Fallida";
                 log.Error("Registrar ModificarCuotaExtraordinaria(EXCEPTION): ", ex);
             }
             finally
             {
                 sqlCon.Close();
             }
             return listamantenimientocorrectivo;
         }
    }
}

